Slackメッセージを時間気にせず送りたいので、chat.scheduleMessage APIを使ってメッセージ送信予約機能を試してみた
本記事要約
- Slackでメッセージを後で送りたいことはありませんか?
- chat.scheduleMessage APIを使うと指定時刻にメッセージを送信できます
- Chrome拡張機能でUIを作ってみました
はじめに
Slackを使っていて
「今日は佐藤さんお休みだからメンションするの止めておこうかな?後で送ろう。」
「朝早いしメッセージ送るのは後にしよう」
「夜遅いしメッセ...(以下同文)」
「土曜だしメッセ...(以下同文)」
というようなケースありませんか?
こんなとき、送り手は気を使わずにメッセージを送れて、受け手は通知を受けたくない時間帯を「Do Not Disturb」で設定しておく運用なら、変に気を使わなくて済んで助かります。
おやすみモードによる通知の一時停止
https://get.slack.help/hc/ja/articles/214908388
さらに「伊藤さん、今忙しそうだからメッセージ送っても埋もれて忘れられそう。後で送ろう。」のようなケースも含めて、良い方法は無いでしょうか?
明日の午前11時にメッセージを送れば何の問題もないと仮定したとき、どういう手段が考えられるでしょうか?
A. 該当時間にリマインダーをセットしておき、自分で @伊藤さん にメッセージを送る
/remind me 伊藤さんにメッセージを送る at 10:55 tomorrow
B. @伊藤さん宛のリマインダーをセットしてしまう(この場合、リマインダーをセットしたときにも通知されるので受けてとしては遠慮したい)
/remind @伊藤さん 飛信隊がついに中央軍のところまで来てましたが今週どうなったか教えてください at 11:00 tomorrow
リマインダーを設定する
https://get.slack.help/hc/ja/articles/208423427
Slackのメッセージ送信をスケジューリングするAPI
chat.scheduleMessage API
https://api.slack.com/methods/chat.scheduleMessage
こちらのAPIを使うと、宛先チャンネル(channel)、メッセージ(text)、投稿日時(post_at)を指定してメッセージの送信が可能です。実際にSlack上にメッセージが現れるのは投稿日時(post_at)の時間なので、気を使わずに好きな時間にメッセージを送れます。
OAuth Access Token入手のためのSlack Apps準備
chat.scheduleMessage APIを使うために、まずはSlack Appsを作り、OAuth Access Tokenを取得します。
Slack Appの作成はこちらのURLから行います。
https://api.slack.com/apps
- Create New Appを選択します
-
App Nameとインストール先のSlackワークスペースを選択します。ここではApp NameをSlack Send Laterとしています
-
Select Permission Scopes欄に
chat:write:user
を指定します。これによりこの後で発行されるOAuth Access Tokenを使うと本人の代理でメッセージが送れるようになります
-
Tokens for Your WorkspaceアイテムにOAuth Access Tokenが表示されているのでCopyします
これでSlack Appsの準備は完了です。
このOAuth Access Tokenは代理メッセージ投稿ができるので、他の人に共有したりしないように注意してください。
chat.scheduleMessage APIを試す
Slack API Testerを使うとchat.scheduleMessage APIを簡単に試せます。
https://api.slack.com/methods/chat.scheduleMessage/test
なお、curlコマンドの場合はこのようになります。※一部実際のものから変更しています
$ curl -XPOST 'https://slack.com/api/chat.scheduleMessage' -H 'Authorization: Bearer xoxp-123456789012-123456789012-123456789012-xxx' -H 'Content-Type: application/json; charset=utf-8' --data-binary '{"channel":"#prj-slack-send-later","post_at":1568361672.602,"text":"Hello World"}' {"ok":true,"scheduled_message_id":"QNAHTH123","channel":"C3M5AA123","post_at":1568361672,"message":{"bot_id":"BNBVC3123","type":"message","text":"Hello World","user":"U3M5AA123","team":"T3LCQU123"}}$
このようにpost_atで指定した時間にメッセージが代理投稿されます。
chat.scheduleMessage APIを使ったChrome拡張機能
chat.scheduleMessage APIを、都度curlコマンドなどで実行するのが煩わしいので、Slack Send LaterというシンプルなChrome拡張機能を作ってみました。
https://chrome.google.com/webstore/detail/slack-send-later/nnbmbbhkagnhjimdegagnoebeijljbci
Slack Send Laterの使い方
- メッセージ送信予約のために、Slackアプリを作成しOAuth Access Tokenを取得します。(Permissions - Select Permission Scopes - chat:write:usersを付与)
すると先にも紹介したように、このように指定時刻になるとメッセージが代理投稿されます。
さいごに
メッセージの送信予約は、cronのようなスケジューラー無しでもchat.scheduleMessage APIを使うと容易に実現できました。
今回紹介したchat.scheduleMessage APIを使ったメッセージの送信予約ですが、Slackクライアントで機能提供されたらSlack Send Laterは不要になるので、短命なChrome拡張機能になるかもしれません。
(私が気付いてないだけで、既にメニューがある?)
補足
SlackのTipsで、KyberというSlack Appsを使ったSlashコマンドによるメッセージ予約が紹介されています。
Send a message later
https://slack.com/intl/ja-jp/slack-tips/send-a-message-later